import { ElMessage } from 'element-plus';
import { HttpMethod } from '@/api/types';
import axios from 'axios';

// 创建 Axios 实例
const apiClient = axios.create({
    baseURL: '/api', // Vite 的开发服务器会代理这个路径到 http://127.0.0.1:5000
    timeout: 10000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json',
    },
});

// 请求拦截器
apiClient.interceptors.request.use(
    (config: any) => {

        // 在这里可以添加自定义的请求头，比如认证 token

        // if (localStorage.getItem('token')) {
        //   config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
        // }
        return config;
    },
    (error:any ) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
apiClient.interceptors.response.use(
    (response: { data: { code: number; data: any; msg: string; }; }) => {
        // 对响应数据做点什么，比如统一处理错误
        console.log('----------⭐⭐⭐⭐⭐----------\n', response.data, '\n----------⭐⭐⭐⭐⭐----------');
        if (response.data?.code == 200) {
            return response.data?.data;
        } else {
            ElMessage({
                message: '接口请求失败！，错误信息：' + response.data?.msg,
                type: 'error',
            })
            return Promise.reject(response.data?.msg ? response.data.msg : 'request error!');
        }
    },
    (error:any) => {
        // 可以在这里统一处理错误，比如显示错误消息
        ElMessage({
            message: '发起请求错误，错误信息：' + error.message,
            type: 'error',
        })
        console.log('----------⭐⭐⭐⭐⭐----------\n', error.message, '\n----------⭐⭐⭐⭐⭐----------');
        return Promise.reject(error.message);
    }
);

// 定义 HTTP 方法
const apiService = {
    GET<T>(url: string, params?: string | Record<string, any>, customHeaders?: Record<string, any>): Promise<T> {
        const headers = {
            ...apiClient.defaults.headers,
            ...(customHeaders || {}) // 合并默认请求头和自定义请求头
        };
        return apiClient.get(url, { params }, headers);
    },
    POST<T>(url: string, data?: string | Record<string, any>, customHeaders?: Record<string, any>): Promise<T> {
        const headers = {
            ...apiClient.defaults.headers,
            ...(customHeaders || {}) // 合并默认请求头和自定义请求头
        };
        return apiClient.post(url, data, { headers });
    },
    DELETE<T>(url: string, params?: string | Record<string, any>, customHeaders?: Record<string, any>): Promise<T> {
        const headers = {
            ...apiClient.defaults.headers,
            ...(customHeaders || {}) // 合并默认请求头和自定义请求头
        };
        return apiClient.delete(url, { data: params, headers });
    },
    PUT<T>(url: string, data?: string | Record<string, any>, customHeaders?: Record<string, any>): Promise<T> {
        const headers = {
            ...apiClient.defaults.headers,
            ...(customHeaders || {}) // 合并默认请求头和自定义请求头
        };
        return apiClient.put(url, data, { headers });
    },
    UPLOADFIRE<T>(url: string, file: File, formData?: FormData, headers?: Record<string, any>): Promise<T> {
        const config = {
            headers: {
                ...headers,
                'Content-Type': 'multipart/form-data', // 对于文件上传，需要设置这个 Content-Type
            },
        };

        // 如果传递了 formData，则使用它；否则创建一个新的 FormData 实例并添加文件
        const formDataToSend = formData || new FormData();
        formDataToSend.append('file', file);

        // 使用 Axios 的默认适配器（基于 XMLHttpRequest 或 Fetch）发送请求
        // 注意：这里我们直接使用了 axios 的请求方法，但传递了 FormData，因此它会自动处理 Content-Type
        // 由于 FormData 的特殊性，我们不需要手动设置 data 属性，而是将 formDataToSend 作为第二个参数传递给 post 方法（这里用 post 是为了利用 Axios 的配置和拦截器）
        // 但是，为了更符合语义和清晰性，我们可以创建一个自定义的 axios 实例或使用 axios.request 方法，并明确指定 method 为 'POST'
        // 然而，为了简单起见，这里我们仍然使用 post 方法，但请注意这不是标准的 REST PUT 请求用于更新资源的方式
        // 在实际项目中，你可能想要根据后端 API 的设计来决定使用 post、put 还是其他方法
        // 另外，如果后端期望的是 'PUT' 方法并且接受 FormData，则应该相应地修改这里的代码
        // 但由于 'PUT' 方法通常用于更新资源而不是上传文件，所以这里我们仍然使用 'POST'
        // 如果你确定后端接受 'PUT' 方法和 FormData，可以将下面的 post 改为 put 并调整后端期望的 method
        return apiClient.post(url, formDataToSend, config);
    },
};

// 对外提供的调用方法
export const apiRequest = {
    // 公共入口
    request<T>(type: string, url: string, paramsOrData?: string | Record<string, any>, headers?: Record<string, any>): Promise<T> {
        console.log('----------⭐⭐⭐⭐⭐----------\n', `type: ${type}, url: /api${url}`, '\n----------⭐⭐⭐⭐⭐----------');
        switch (type.toUpperCase()) {
            case HttpMethod.GET:
                return apiService.GET(url, paramsOrData, headers);
            case HttpMethod.POST:
                return apiService.POST(url, paramsOrData, headers);
            case HttpMethod.DELETE:
                return apiService.DELETE(url, paramsOrData, headers);
            case HttpMethod.PUT:
                return apiService.PUT(url, paramsOrData, headers);
            case 'UPLOADFIRE':
            default:
                throw new Error(`Unsupported request type: ${type}`);
        }
    },

    // 上传入口
    uploadRequest<T>(url: string, file: File, formData?: FormData, headers?: Record<string, any>): Promise<T> {
        console.log('----------⭐⭐⭐⭐⭐----------\n', url, '\n----------⭐⭐⭐⭐⭐----------');
        return apiService.UPLOADFIRE(url, file, formData, headers);
    },
}
